package simulacion.control;

import java.util.HashMap;

import compartido.IComparadorDeTransacciones;
import compartido.ITransaccion;

public class PrimerRegistradoMayorPrioridad implements IComparadorDeTransacciones {
 
	private HashMap<Class<? extends ITransaccion>,Integer> prioridades;
	private Integer siguientePrioridad;
	 
	public int minimaPrioridad() {
		return Integer.MIN_VALUE;
	}
	
	public int maximaPrioridad() {
		return Integer.MAX_VALUE;
	}
	
	public PrimerRegistradoMayorPrioridad() {
		prioridades = new HashMap<Class<? extends ITransaccion>, Integer>();
		siguientePrioridad = maximaPrioridad();
	}

	public int getPrioridad(ITransaccion t) {
		int prioridad = minimaPrioridad();
		Class<? extends ITransaccion> buscada = t.getClass();
		if (prioridades.containsKey(buscada))
			prioridad = prioridades.get(buscada);
		else {
			for (Class<? extends ITransaccion> registrada : prioridades.keySet()) {
				if (registrada.isAssignableFrom(buscada)) {
					prioridad = prioridades.get(registrada);
					break;
				}
			}
		}
		return prioridad;
	}
	
	@Override
	public int compare(ITransaccion o1, ITransaccion o2) {
		return comparar(o1,o2);
	}
	
	public int comparar(ITransaccion a, ITransaccion b) {
		int prioridadDeA = getPrioridad(a);
		int prioridadDeB = getPrioridad(b);
		int resultado = (prioridadDeB - prioridadDeA);
		if (resultado == 0)
			resultado = b.getPrioridad() - a.getPrioridad();
		return resultado;
	}
	 
	public void registrar(Class<? extends ITransaccion> clase) {
		prioridades.put(clase,siguientePrioridad);
		if (siguientePrioridad > minimaPrioridad())
			siguientePrioridad--;
	}
	 
	public void olvidar(Class<? extends ITransaccion> clase) {
		Integer prioridadSaliente = prioridades.get(clase);
		if (prioridadSaliente == siguientePrioridad+1) {
			prioridades.remove(clase);
			siguientePrioridad++;
		}
	}	 
}
 
